
package com.bee.common.tools.sms;

import com.bee.common.tools.context.PropertiesUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import com.taobao.api.ApiException;
import com.taobao.api.DefaultTaobaoClient;
import com.taobao.api.TaobaoClient;
import com.taobao.api.request.AlibabaAliqinFcSmsNumQueryRequest;
import com.taobao.api.request.AlibabaAliqinFcSmsNumSendRequest;
import com.taobao.api.response.AlibabaAliqinFcSmsNumQueryResponse;
import com.taobao.api.response.AlibabaAliqinFcSmsNumSendResponse;
/**
 * 阿里大鱼短信发送
 * 
 */
@Component
@ConfigurationProperties("application.properties")
public class ALSMSUtils{
    private static final Logger logger = LoggerFactory.getLogger(ALSMSUtils.class);
	private static final long serialVersionUID = 1L;
	private static final String tb_url = "http://gw.api.taobao.com/router/rest";
	private static final String tb_app_key = "23383702";
	private static final String tb_app_secret = "80a2d4c274968006e6f8f306a5942d95";
	@Value("${sms.msgSendFlag}")
	private static boolean msgSendFlag;

	
	
	/**
	 * 阿里大鱼短信发送接口
	 * @param extend	--公共回传参数
	 * @param sms_free_sign_name	--短信签名
	 * @param sms_param		--短信模板变量，传参规则{"key":"value"}，key的名字须和申请模板中的变量名一致，多个变量之间以逗号隔开。示例：针对模板“验证码${code}，您正在进行${product}身份验证，打死不要告诉别人哦！”，传参时需传入{"code":"1234","product":"alidayu"}
	 * @param rec_num	--短信接收号码。支持单个或多个手机号码，传入号码为11位手机号码，不能加0或+86。群发短信需传入多个号码，以英文逗号分隔，一次调用最多传入200个号码。示例：18600000000,13911111111,13322222222
	 * @param sms_template_code	--短信模板ID，传入的模板必须是在阿里大鱼“管理中心-短信模板管理”中的可用模板。示例：SMS_585014
	 * @return
	 * @throws ApiException
	 */
	public static boolean sendSms(Sms sms) throws ApiException {
		String extend=sms.getExtend();
		String sms_free_sign_name=sms.getSms_free_sign_name();
		String sms_param=sms.getSms_param();
		String rec_num=sms.getRec_num();
		String sms_template_code=sms.getSms_template_code();
		msgSendFlag="true".equals(PropertiesUtils.getProperty("application.properties","sms.msgSendFlag"));
		if(msgSendFlag){
			TaobaoClient client = new DefaultTaobaoClient(tb_url, tb_app_key, tb_app_secret);
			AlibabaAliqinFcSmsNumSendRequest req = new AlibabaAliqinFcSmsNumSendRequest();
			if(StringUtils.isNotBlank(extend))
				req.setExtend(extend);
			req.setSmsType("normal");
			req.setSmsFreeSignName(sms_free_sign_name);
			req.setSmsParamString(sms_param);
			req.setRecNum(rec_num);
			req.setSmsTemplateCode(sms_template_code);
			AlibabaAliqinFcSmsNumSendResponse rsp = client.execute(req);
			/**
			 * 测试发现如果出错，rsp.getErrorCode()会获取到错误编码，如果成功则为null。
			 */
			if(StringUtils.isBlank(rsp.getErrorCode()) || "0".equalsIgnoreCase(rsp.getErrorCode()))
				return true;
			else{
				logger.error("ALSMSUtils==>sendSms(), " + rsp.getErrorCode() + ":" + rsp.getMsg());
				return false;
			}
		}else{
			logger.error("ALSMSUtils==>sendSms(),短信开关未开启 ");
			return false;
		}
		
	}
	
	/**
	 * 查询短信记录(除biz_id可不传，其他参数必传，所以每次只能查询一个手机号码的记录)
	 * @param biz_id	--短信发送流水（可选）
	 * @param rec_num	--短信接收号码
	 * @param query_date	--短信发送日期，支持近30天记录查询，格式yyyyMMdd
	 * @param current_page	--分页参数,页码
	 * @param page_size	--分页参数，每页数量。最大值100
	 * @return
	 * @throws ApiException
	 */
	public static AlibabaAliqinFcSmsNumQueryResponse querySms(String biz_id, String rec_num, String query_date, long current_page, long page_size) throws ApiException {
		TaobaoClient client = new DefaultTaobaoClient(tb_url, tb_app_key, tb_app_secret);
		AlibabaAliqinFcSmsNumQueryRequest req = new AlibabaAliqinFcSmsNumQueryRequest();
		if(StringUtils.isNotBlank(biz_id))
			req.setBizId(biz_id);
		req.setRecNum(rec_num);
		req.setQueryDate(query_date);
		req.setCurrentPage(current_page);
		req.setPageSize(page_size);
		AlibabaAliqinFcSmsNumQueryResponse rsp = client.execute(req);
		System.out.println(rsp.getBody());
		return rsp;
	}
	
	public static void main(String[] args) {
		try {
			System.out.println(sendSms(new Sms("1001", "登录验证", "{\"code\":\"6688\",\"product\":\"123\"}", "15018430875", "SMS_10180323")));
		} catch (ApiException e) {
			e.printStackTrace();
		}
	}
}
